package es.gesfutbol.validator;

import org.springframework.validation.Errors;

import es.gesfutbol.dao.IPenyaDao;
import es.gesfutbol.dao.IPenyistaDao;
import es.gesfutbol.domini.implementacio.Penya;
import es.gesfutbol.domini.implementacio.Penyista;
import es.gesfutbol.util.AbstractGesFutbolValidator;
import es.gesfutbol.web.backbean.PenyaBackBean;

public class CreaPenyaValidator  extends AbstractGesFutbolValidator{

	private IPenyaDao penyaDao;
	
	private IPenyistaDao penyistaDao;
	
	private String COMB_GENERAL_NOT_NUMERIC = "Las combinaciones generales deben contener valores numéricos";
	private String NOMBRE_PENYA = "El nombre de la peña ya existe";
	private String SUMA_COMBINACIO = "La suma de la combinación general no puede ser mayor que 15";
	private String TE_PENYA = "El usuario ya tiene una penya assignada";
	private String PERCENTATGE_NOT_NUMERIC = "Los porcentajes deben contener valores numéricos";
	private String SUMA_PERCENTATGES = "La suma de los porcentages no puede ser mayor que 100";
	private String PENYA = "nomPenya";
	private String FIX1 = "generalFix1";
	private String DOBLE1 = "generalDob1";
	private String TRIPLE1 ="generalTrip1";
	private String FIX2 = "generalFix2";
	private String DOBLE2 = "generalDob2";
	private String TRIPLE2 = "generalTrip2";	
	private String FIX3 = "generalFix3";
	private String DOBLE3 = "generalDob3";
	private String TRIPLE3 = "generalTrip3";
	private String ENFRONTAMENTS_ANTERIORS = "encuentroAnterior";
	private String CLASSIFICACIO = "classificacion";
	private String LOCAL = "jugarLocal";
	private String PRIMERA_VOLTA = "primeraVuelta";
	private String ULTIMS_RESULTATS = "ultimosResultados";
	private static final String NOM_PENYA_NOT_EMPTY = "Es necesario informar el nombre de la peña.";
	
	public IPenyaDao getPenyaDao() {
		return penyaDao;
	}

	public void setPenyaDao(IPenyaDao penyaDao) {
		this.penyaDao = penyaDao;
	}
	
	public IPenyistaDao getPenyistaDao() {
		return penyistaDao;
	}

	public void setPenyistaDao(IPenyistaDao penyistaDao) {
		this.penyistaDao = penyistaDao;
	}

	@Override
	public boolean supports(Class<?> clazz) {
		return PenyaBackBean.class.isAssignableFrom(clazz);
	}

	@Override
	public void validate(Object target, Errors errors) {
		
		PenyaBackBean creaBB = (PenyaBackBean) target;
		
		if(!rejectIfIsEmpty(errors, PENYA, NOM_PENYA_NOT_EMPTY)){
			Penyista penyista = penyistaDao.findByIdUsuari(creaBB.getIdUsuari());
			
			if(penyista == null){
				//Comprovem que no existeixi el nom de la penya.
				Penya penya = penyaDao.findByNom(creaBB.getNomPenya());
				if(penya != null){
					errors.rejectValue(PENYA, "", NOMBRE_PENYA);
				}
				
				//Validem si la combinació general 1 és numèrica i si suma menys o igual a 15
				if(!rejectIfNotIntegerValue(errors, FIX1, COMB_GENERAL_NOT_NUMERIC)
						&& !rejectIfNotIntegerValue(errors, DOBLE1, COMB_GENERAL_NOT_NUMERIC)
						&& !rejectIfNotIntegerValue(errors, TRIPLE1, COMB_GENERAL_NOT_NUMERIC)){
					
					Integer i1 = Integer.valueOf(creaBB.getGeneralFix1());
					Integer i2 = Integer.valueOf(creaBB.getGeneralDob1());
					Integer i3 = Integer.valueOf(creaBB.getGeneralTrip1());
				
					if(i1+i2+i3>15){
						errors.rejectValue(FIX1, "", SUMA_COMBINACIO);
					}
				}
				//Validem si la combinació general 2 és numèrica i si suma menys o igual a 15
				if(!rejectIfNotIntegerValue(errors, FIX2, COMB_GENERAL_NOT_NUMERIC)
						&& !rejectIfNotIntegerValue(errors, DOBLE2, COMB_GENERAL_NOT_NUMERIC)
						&& !rejectIfNotIntegerValue(errors, TRIPLE2, COMB_GENERAL_NOT_NUMERIC)){
					
					Integer i1 = Integer.valueOf(creaBB.getGeneralFix2());
					Integer i2 = Integer.valueOf(creaBB.getGeneralDob2());
					Integer i3 = Integer.valueOf(creaBB.getGeneralTrip2());
				
					if(i1+i2+i3>15){
						errors.rejectValue(FIX2, "", SUMA_COMBINACIO);
					}
				}
				//Validem si la combinació general 3 és numèrica i si suma menys o igual a 15
				if(!rejectIfNotIntegerValue(errors, FIX3, COMB_GENERAL_NOT_NUMERIC)
						&& !rejectIfNotIntegerValue(errors, DOBLE3, COMB_GENERAL_NOT_NUMERIC)
						&& !rejectIfNotIntegerValue(errors, TRIPLE3, COMB_GENERAL_NOT_NUMERIC)){
					
					Integer i1 = Integer.valueOf(creaBB.getGeneralFix3());
					Integer i2 = Integer.valueOf(creaBB.getGeneralDob3());
					Integer i3 = Integer.valueOf(creaBB.getGeneralTrip3());
				
					if(i1+i2+i3>15){
						errors.rejectValue(FIX3, "", SUMA_COMBINACIO);
					}
				}
				//Validem els percentatges.
				if(!rejectIfNotIntegerValue(errors, ENFRONTAMENTS_ANTERIORS, PERCENTATGE_NOT_NUMERIC)
						&& !rejectIfNotIntegerValue(errors, CLASSIFICACIO, PERCENTATGE_NOT_NUMERIC)
						&& !rejectIfNotIntegerValue(errors, LOCAL, PERCENTATGE_NOT_NUMERIC)
						&& !rejectIfNotIntegerValue(errors, PRIMERA_VOLTA, PERCENTATGE_NOT_NUMERIC)
						&& !rejectIfNotIntegerValue(errors, ULTIMS_RESULTATS, PERCENTATGE_NOT_NUMERIC)){
				
					Integer i1 = Integer.valueOf(creaBB.getEncuentroAnterior());
					Integer i2 = Integer.valueOf(creaBB.getClassificacion());
					Integer i3 = Integer.valueOf(creaBB.getPrimeraVuelta());
					Integer i4 = Integer.valueOf(creaBB.getUltimosResultados());
					Integer i5 = Integer.valueOf(creaBB.getJugarLocal());
					
					if(i1+i2+i3+i4+i5>100){
						errors.rejectValue(ENFRONTAMENTS_ANTERIORS, "", SUMA_PERCENTATGES);
					}
				}	
			}else{
				errors.rejectValue(PENYA, "", TE_PENYA);
			}
		}
	}
}
